package com.example;

import com.example.spi.DatabaseDriver;

import java.util.ServiceLoader;

/**
 * Java SPI机制演示
 * SPI (Service Provider Interface) 是Java提供的一种服务发现机制
 */
public class Main {
    public static void main(String[] args) {
        System.out.println("=== Java SPI机制演示 - 数据库驱动加载 ===\n");
        
        // 使用ServiceLoader加载所有DatabaseDriver的实现
        // 这是SPI的核心：通过ServiceLoader自动发现和加载服务实现
        ServiceLoader<DatabaseDriver> loader = ServiceLoader.load(DatabaseDriver.class);
        
        System.out.println("1. 加载所有已注册的数据库驱动：");
        System.out.println("----------------------------------------");
        for (DatabaseDriver driver : loader) {
            System.out.println("发现驱动: " + driver.getDriverName());
            System.out.println("实现类: " + driver.getClass().getName());
            System.out.println();
        }
        
        // 演示根据URL自动选择合适的驱动
        System.out.println("\n2. 根据URL自动选择合适的驱动：");
        System.out.println("----------------------------------------");
        String[] urls = {
            "jdbc:mysql://localhost:3306/testdb",
            "jdbc:oracle:thin:@localhost:1521:orcl",
            "jdbc:postgresql://localhost:5432/testdb"
        };
        
        for (String url : urls) {
            System.out.println("尝试连接: " + url);
            DatabaseDriver selectedDriver = findDriverForURL(url);
            if (selectedDriver != null) {
                String result = selectedDriver.connect(url);
                System.out.println(result);
            } else {
                System.out.println("未找到支持该URL的驱动");
            }
            System.out.println();
        }
        
        System.out.println("\n=== SPI核心要点 ===");
        System.out.println("1. 定义服务接口: DatabaseDriver");
        System.out.println("2. 提供服务实现: MySQLDriver, OracleDriver, PostgreSQLDriver");
        System.out.println("3. 配置文件: META-INF/services/com.example.spi.DatabaseDriver");
        System.out.println("4. 使用ServiceLoader加载服务");
        System.out.println("\n这就是JDBC驱动加载的核心原理！");
    }
    
    /**
     * 根据URL查找合适的驱动
     * 这模拟了JDBC DriverManager的工作原理
     */
    private static DatabaseDriver findDriverForURL(String url) {
        ServiceLoader<DatabaseDriver> loader = ServiceLoader.load(DatabaseDriver.class);
        for (DatabaseDriver driver : loader) {
            if (driver.acceptsURL(url)) {
                return driver;
            }
        }
        return null;
    }
}
